knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(GGally)

Attaching package: ‘GGally’

The following object is masked from ‘package:dplyr’:

    nasa
library(patchwork)

#Setting the data filepath

file_path <-"~/Documents/BI685Files/GitHubDocs/chronister_andrew/data"
sparrows_raw <- read_tsv(file.path(file_path, "sparrows.txt"))
Parsed with column specification:
cols(
  wingcrd = col_double(),
  flatwing = col_double(),
  tarsus = col_double(),
  head = col_double(),
  culmen = col_double(),
  nalospi = col_double(),
  wt = col_double(),
  bandstat = col_double(),
  initials = col_double(),
  Year = col_double(),
  Month = col_double(),
  Day = col_double(),
  Location = col_double(),
  SpeciesCode = col_double(),
  Sex = col_double(),
  Age = col_double()
)
View(sparrows_raw)
sparrows_raw
sparrows <- sparrows_raw %>%
  mutate(box_group = "Sparrows",
         row_order = 1:nrow(.))
View(sparrows)

#Figure 2: Outliers

plot_box <- sparrows %>%
  ggplot(aes(x = box_group,
             y = wingcrd))+
  geom_boxplot(width = 0.25)+
  labs(x = NULL,
       y = "Wing length (mm)")

#Create Cleveland plot

plot_cleveland <- sparrows %>%
  ggplot(aes(x = wingcrd,
             y = row_order))+
  geom_point()+
  labs(x = "Wing length (mm)",
       y = "Order of the data")

#Store plots into variables… #Plot both plots side by side.

plot_box + plot_cleveland

#Add Coordinate Flip so scales line up

plot_box + plot_cleveland + coord_flip()

#Create Culmen variable

p_culmen <-  sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = culmen)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_culmen

#Create nalospi variable

p_nalospi <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = nalospi)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_nalospi

#Create wt variable

p_wt <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wt)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wt

NA

#Create wingcrd variable (I’m using copy/paste on the three lines of theme because I’m lazy…)

p_wingcrd <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wingcrd)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wingcrd

#Create tarsus variable

p_tarsus <- sparrows %>%
  ggplot(aes(y = row_order))+
  geom_point(aes(x = tarsus))+
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_tarsus

#Create head variable

p_head <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = head)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_head

#Now, put them all together in one figure.

p_culmen <-  sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = culmen)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_nalospi <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = nalospi)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wt <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wt)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wingcrd <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wingcrd)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_tarsus <- sparrows %>%
  ggplot(aes(y = row_order))+
  geom_point(aes(x = tarsus))+
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_head <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = head)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_culmen + p_nalospi + p_wt + p_wingcrd + p_tarsus + p_head + plot_layout(ncol = 3, nrow = 2)

#It looks like there is one possible outlier in nalospi, one in wingcrd, one in tarsus and two in head. All of these would need further consideration, just like the wingcrd example, to determine if the value is practical or an error.

####Figure 5 #First code block to re-create the histogram

h1 <- sparrows %>%
  filter(Month %in% 6:8) %>%
  ggplot() +
  geom_histogram(aes(x = wt),
                 binwidth = 0.5,
                 boundary = 0,
                 closed = "right",
                 color = "black") +
  scale_x_continuous(breaks = seq(14,28,by = 2))
h1

#Filter all but June, July and August, etc.

h2 <- sparrows %>%
  filter(Month %in% 6:8) %>%
  mutate(Month = case_when(
    Month == 6 ~ "June",
    Month == 7 ~ "July",
    Month == 8 ~ "August")) %>%
  ggplot() +
  geom_histogram(aes(x = wt),
                 binwidth = 0.5,
                 boundary = 0,
                 color = "black") +
  scale_x_continuous(breaks = seq(14,28,by = 2)) +
  facet_wrap(~Month, ncol = 1)
h2

#Now assemble into one figure.

h1 + h2

#Grad/Honors density plot. #Left panel playground(where I’ll figure out how to do it)

dp_1 <- sparrows %>%
  filter(Month %in% 6:8) %>%
  ggplot() +
  geom_density(aes(x = wt)) +
  scale_x_continuous(breaks = seq(14,28, by = 2))
dp_1

#Ok. That looks similar enough to the example in the notes. Now, on to the filled density plot trinity. Breakthrough. That is kinda pretty…

dp_2 <- sparrows %>%
  filter(Month %in% 6:8)%>%
  mutate(Month = case_when(
    Month == 6 ~ "June",
    Month == 7 ~ "July",
    Month == 8 ~ "August")) %>%
  ggplot()+
  geom_density(aes(x = wt,
                   fill = Month),
               alpha = 0.42)+
  scale_x_continuous(breaks = seq(14, 28, by = 2))
dp_2

#Now simply put the two together.

dp_1 + dp_2 + plot_layout(nrow = 1)

#Create ggscatmat plot of data using first 7 columns

sparrows %>% ggscatmat(columns = 1:7)

#Tis a thing of beauty, and really, really easy.

#Figure 11: Interactions

month_order <-  c("May", "June", "July", "August", "September")
sparrows %>%
  filter(Month %in% 5:9,
         Sex != 0) %>%
  mutate(Month = case_when(
    Month == 5 ~ "May",
    Month == 6 ~ "June",
    Month == 7 ~ "July",
    Month == 8 ~ "August",
    Month == 9 ~ "September"),
    Month = factor(Month, levels = month_order, ordered = TRUE),
    Sex = ifelse(Sex == 4, "Male", "Female")) %>%
  ggplot(aes(x = wingcrd,
             y = wt))+
  geom_point()+
  geom_smooth(method = lm, se = FALSE)+
  facet_grid(Sex ~ Month)

Part 2:Aegla Crab-fest

#import the raw data

aegla_raw <- read_csv(file.path(file_path, "aegla_crabs.csv"))
Parsed with column specification:
cols(
  .default = col_double(),
  Site = col_character()
)
See spec(...) for full column specifications.
aegla_raw

#Select to remove certain columns

aegla_select <- select(aegla_raw, -Site, -AT, -WT, -Shrimp, -Aeglam, -AeglaFe, -AeglaFo)
aegla_select

#Use drop_na to drop row with NAs

aegla_dropna <- aegla_select %>%
  drop_na(4:12)
aegla_dropna

#Create the row_order dummy variable

aegla_clean <- aegla_dropna %>%
  mutate(box_group = "Crabs",
         row_order = 1:nrow(.))
aegla_clean

#Trying the more efficient pipe method.

aegla <- aegla_raw %>%
  select(-c("Site", "AT", "WT", "Shrimp", "Aeglam", "AeglaFe", "AeglaFo"))%>%
  drop_na(c("N"))%>%
  mutate(box_group = "Crabs",
         row_order = 1:nrow(.))
aegla

#Explore the data

p_width <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Width))
             
p_depth <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Depth))
             
p_flow <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Flow))
p_ph <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=pH))
p_tds <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=TDS))
p_cond<- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Cond))
p_n <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=N))
p_ni <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Ni))
p_nt <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Nt))
p_phos <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Phos))
p_mg <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Mg))
p_ca <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Ca))
p_crab <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Crab))
p_width + p_depth + p_flow 

p_ph + p_tds + p_cond  

p_n + p_ni + p_nt 

p_phos + p_mg + p_ca + p_crab

ggplot(aegla, aes(x=row_order, y=Phos))+
  geom_boxplot()+
  geom_point()

#The outliers I found are sample 1, where the Phosphate levels are almost 4 times higher than the next highest value, sample 14 has low pH at 6.25, with the next lowest measurement being 6.75 and 0 waterflow, and sample 22 was taken at a width of 12.5 (meters?) and a depth of 5 meters. The width measurement is not much of an outlier, but the depth measurement is twice as deep as the next highest value. I would contend that the real outlier is the phosphate level in sample 1.

#Plot four variables with a Cleveland plot. It just so happened that I made plots for all of the variables…

p_width + p_depth + p_cond + p_crab + plot_layout(nrow = 2, ncol = 2)

#Make three histograms

ha1 <- ggplot(data = aegla)+
  geom_histogram(aes(x = N),
                 binwidth = .0025,
                 boundary = 0,
                 closed = "right",
                 color = "black")
ha1

NA
NA
NA
ha2 <- ggplot(data = aegla)+
  geom_histogram(aes(x=Phos),
                 binwidth = .005,
                 boundary = 0,
                 closed = "right",
                 color = "blue")
ha2

ha3 <-  ggplot(aegla)+
  geom_histogram(aes(x=pH),
                 binwidth = .005,
                 boundary = 0,
                 closed = "right",
                 color = "red")
ha3

#Create density plots

hdp1 <- ggplot(aegla)+
  geom_density(aes(x=N))
hdp1

hdp2 <- ggplot(aegla)+
  geom_density(aes(x=Phos))
hdp2

hdp3 <- ggplot(aegla)+
  geom_density(aes(x=pH))
hdp3

#Use patchwork to produce 2 col matrix

ha1 + hdp1 + ha2 + hdp2 + ha3 + hdp3 + plot_layout(ncol=2, nrow = 3)

LS0tCnRpdGxlOiAiSFcgMDcgUGFydCAxOiBEYXRhIFZpc3VhbGl6YXRpb24iCmF1dGhvcjogIkFuZHJldyBDaHJvbmlzdGVyIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQpgYGB7cn0KCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCgojU2V0dGluZyB0aGUgZGF0YSBmaWxlcGF0aApgYGB7cn0KZmlsZV9wYXRoIDwtIn4vRG9jdW1lbnRzL0JJNjg1RmlsZXMvR2l0SHViRG9jcy9jaHJvbmlzdGVyX2FuZHJldy9kYXRhIgpzcGFycm93c19yYXcgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGZpbGVfcGF0aCwgInNwYXJyb3dzLnR4dCIpKQpWaWV3KHNwYXJyb3dzX3JhdykKc3BhcnJvd3NfcmF3CmBgYApgYGB7cn0Kc3BhcnJvd3MgPC0gc3BhcnJvd3NfcmF3ICU+JQogIG11dGF0ZShib3hfZ3JvdXAgPSAiU3BhcnJvd3MiLAogICAgICAgICByb3dfb3JkZXIgPSAxOm5yb3coLikpClZpZXcoc3BhcnJvd3MpCmBgYAojRmlndXJlIDI6IE91dGxpZXJzIApgYGB7cn0KcGxvdF9ib3ggPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYm94X2dyb3VwLAogICAgICAgICAgICAgeSA9IHdpbmdjcmQpKSsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjI1KSsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9ICJXaW5nIGxlbmd0aCAobW0pIikKYGBgCiNDcmVhdGUgQ2xldmVsYW5kIHBsb3QKYGBge3J9CnBsb3RfY2xldmVsYW5kIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeCA9IHdpbmdjcmQsCiAgICAgICAgICAgICB5ID0gcm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludCgpKwogIGxhYnMoeCA9ICJXaW5nIGxlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiT3JkZXIgb2YgdGhlIGRhdGEiKQpgYGAKI1N0b3JlIHBsb3RzIGludG8gdmFyaWFibGVzLi4uCiNQbG90IGJvdGggcGxvdHMgc2lkZSBieSBzaWRlLgpgYGB7cn0KcGxvdF9ib3ggKyBwbG90X2NsZXZlbGFuZApgYGAKI0FkZCBDb29yZGluYXRlIEZsaXAgc28gc2NhbGVzIGxpbmUgdXAKYGBge3J9CnBsb3RfYm94ICsgcGxvdF9jbGV2ZWxhbmQgKyBjb29yZF9mbGlwKCkKYGBgCiNDcmVhdGUgQ3VsbWVuIHZhcmlhYmxlCmBgYHtyfQpwX2N1bG1lbiA8LSAgc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBjdWxtZW4pKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKcF9jdWxtZW4KYGBgCiNDcmVhdGUgbmFsb3NwaSB2YXJpYWJsZQpgYGB7cn0KcF9uYWxvc3BpIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbmFsb3NwaSkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX25hbG9zcGkKYGBgCiNDcmVhdGUgd3QgdmFyaWFibGUKYGBge3J9CnBfd3QgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3dCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3d0CiAgCmBgYAojQ3JlYXRlIHdpbmdjcmQgdmFyaWFibGUgKEknbSB1c2luZyBjb3B5L3Bhc3RlIG9uIHRoZSB0aHJlZSBsaW5lcyBvZiB0aGVtZSBiZWNhdXNlIEknbSBsYXp5Li4uKQpgYGB7cn0KcF93aW5nY3JkIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gd2luZ2NyZCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3dpbmdjcmQKYGBgCiNDcmVhdGUgdGFyc3VzIHZhcmlhYmxlCmBgYHtyfQpwX3RhcnN1cyA8LSBzcGFycm93cyAlPiUKICBnZ3Bsb3QoYWVzKHkgPSByb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh4ID0gdGFyc3VzKSkrCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKcF90YXJzdXMKYGBgCiNDcmVhdGUgaGVhZCB2YXJpYWJsZQpgYGB7cn0KcF9oZWFkIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaGVhZCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX2hlYWQKYGBgCiNOb3csIHB1dCB0aGVtIGFsbCB0b2dldGhlciBpbiBvbmUgZmlndXJlLiAKYGBge3J9CnBfY3VsbWVuIDwtICBzcGFycm93cyAlPiUKICBnZ3Bsb3QoYWVzKHkgPSByb3dfb3JkZXIpKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGN1bG1lbikpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX25hbG9zcGkgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBuYWxvc3BpKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfd3QgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3dCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3dpbmdjcmQgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3aW5nY3JkKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfdGFyc3VzIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHggPSB0YXJzdXMpKSsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX2hlYWQgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBoZWFkKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfY3VsbWVuICsgcF9uYWxvc3BpICsgcF93dCArIHBfd2luZ2NyZCArIHBfdGFyc3VzICsgcF9oZWFkICsgcGxvdF9sYXlvdXQobmNvbCA9IDMsIG5yb3cgPSAyKQpgYGAKI0l0IGxvb2tzIGxpa2UgdGhlcmUgaXMgb25lIHBvc3NpYmxlIG91dGxpZXIgaW4gbmFsb3NwaSwgb25lIGluIHdpbmdjcmQsIG9uZSBpbiB0YXJzdXMgYW5kIHR3byBpbiBoZWFkLiBBbGwgb2YgdGhlc2Ugd291bGQgbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24sIGp1c3QgbGlrZSB0aGUgd2luZ2NyZCBleGFtcGxlLCB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIHByYWN0aWNhbCBvciBhbiBlcnJvci4gCgojIyMjRmlndXJlIDUKI0ZpcnN0IGNvZGUgYmxvY2sgdG8gcmUtY3JlYXRlIHRoZSBoaXN0b2dyYW0KYGBge3J9CmgxIDwtIHNwYXJyb3dzICU+JQogIGZpbHRlcihNb250aCAlaW4lIDY6OCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gd3QpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBjbG9zZWQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTQsMjgsYnkgPSAyKSkKaDEKYGBgCiNGaWx0ZXIgYWxsIGJ1dCBKdW5lLCBKdWx5IGFuZCBBdWd1c3QsIGV0Yy4KYGBge3J9CmgyIDwtIHNwYXJyb3dzICU+JQogIGZpbHRlcihNb250aCAlaW4lIDY6OCkgJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSB3dCksCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTQsMjgsYnkgPSAyKSkgKwogIGZhY2V0X3dyYXAofk1vbnRoLCBuY29sID0gMSkKaDIKYGBgCiNOb3cgYXNzZW1ibGUgaW50byBvbmUgZmlndXJlLgpgYGB7cn0KaDEgKyBoMgpgYGAKI0dyYWQvSG9ub3JzIGRlbnNpdHkgcGxvdC4KI0xlZnQgcGFuZWwgcGxheWdyb3VuZCh3aGVyZSBJJ2xsIGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0KQpgYGB7cn0KZHBfMSA8LSBzcGFycm93cyAlPiUKICBmaWx0ZXIoTW9udGggJWluJSA2OjgpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB3dCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE0LDI4LCBieSA9IDIpKQpkcF8xCmBgYAojT2suIFRoYXQgbG9va3Mgc2ltaWxhciBlbm91Z2ggdG8gdGhlIGV4YW1wbGUgaW4gdGhlIG5vdGVzLiAgTm93LCBvbiB0byB0aGUgZmlsbGVkIGRlbnNpdHkgcGxvdCB0cmluaXR5LiAgQnJlYWt0aHJvdWdoLiBUaGF0IGlzIGtpbmRhIHByZXR0eS4uLgpgYGB7cn0KZHBfMiA8LSBzcGFycm93cyAlPiUKICBmaWx0ZXIoTW9udGggJWluJSA2OjgpJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIpKSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB3dCwKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBNb250aCksCiAgICAgICAgICAgICAgIGFscGhhID0gMC40MikrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNCwgMjgsIGJ5ID0gMikpCmRwXzIKYGBgCiNOb3cgc2ltcGx5IHB1dCB0aGUgdHdvIHRvZ2V0aGVyLiAKYGBge3J9CmRwXzEgKyBkcF8yICsgcGxvdF9sYXlvdXQobnJvdyA9IDEpCmBgYAojQ3JlYXRlIGdnc2NhdG1hdCBwbG90IG9mIGRhdGEgdXNpbmcgZmlyc3QgNyBjb2x1bW5zCmBgYHtyfQpzcGFycm93cyAlPiUgZ2dzY2F0bWF0KGNvbHVtbnMgPSAxOjcpCmBgYAojVGlzIGEgdGhpbmcgb2YgYmVhdXR5LCBhbmQgcmVhbGx5LCByZWFsbHkgZWFzeS4gIAoKI0ZpZ3VyZSAxMTogSW50ZXJhY3Rpb25zCmBgYHtyfQptb250aF9vcmRlciA8LSAgYygiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIikKc3BhcnJvd3MgJT4lCiAgZmlsdGVyKE1vbnRoICVpbiUgNTo5LAogICAgICAgICBTZXggIT0gMCkgJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNSB+ICJNYXkiLAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIsCiAgICBNb250aCA9PSA5IH4gIlNlcHRlbWJlciIpLAogICAgTW9udGggPSBmYWN0b3IoTW9udGgsIGxldmVscyA9IG1vbnRoX29yZGVyLCBvcmRlcmVkID0gVFJVRSksCiAgICBTZXggPSBpZmVsc2UoU2V4ID09IDQsICJNYWxlIiwgIkZlbWFsZSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB3aW5nY3JkLAogICAgICAgICAgICAgeSA9IHd0KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKSsKICBmYWNldF9ncmlkKFNleCB+IE1vbnRoKQpgYGAKIyMjIyBQYXJ0IDI6QWVnbGEgQ3JhYi1mZXN0IAojaW1wb3J0IHRoZSByYXcgZGF0YQpgYGB7cn0KYWVnbGFfcmF3IDwtIHJlYWRfY3N2KGZpbGUucGF0aChmaWxlX3BhdGgsICJhZWdsYV9jcmFicy5jc3YiKSkKYWVnbGFfcmF3CmBgYAojU2VsZWN0IHRvIHJlbW92ZSBjZXJ0YWluIGNvbHVtbnMKYGBge3J9CmFlZ2xhX3NlbGVjdCA8LSBzZWxlY3QoYWVnbGFfcmF3LCAtU2l0ZSwgLUFULCAtV1QsIC1TaHJpbXAsIC1BZWdsYW0sIC1BZWdsYUZlLCAtQWVnbGFGbykKYWVnbGFfc2VsZWN0CmBgYAojVXNlIGRyb3BfbmEgdG8gZHJvcCByb3cgd2l0aCBOQXMKYGBge3J9CmFlZ2xhX2Ryb3BuYSA8LSBhZWdsYV9zZWxlY3QgJT4lCiAgZHJvcF9uYSg0OjEyKQphZWdsYV9kcm9wbmEKYGBgCiNDcmVhdGUgdGhlIHJvd19vcmRlciBkdW1teSB2YXJpYWJsZQpgYGB7cn0KYWVnbGFfY2xlYW4gPC0gYWVnbGFfZHJvcG5hICU+JQogIG11dGF0ZShib3hfZ3JvdXAgPSAiQ3JhYnMiLAogICAgICAgICByb3dfb3JkZXIgPSAxOm5yb3coLikpCmFlZ2xhX2NsZWFuCmBgYAojVHJ5aW5nIHRoZSBtb3JlIGVmZmljaWVudCBwaXBlIG1ldGhvZC4KYGBge3J9CmFlZ2xhIDwtIGFlZ2xhX3JhdyAlPiUKICBzZWxlY3QoLWMoIlNpdGUiLCAiQVQiLCAiV1QiLCAiU2hyaW1wIiwgIkFlZ2xhbSIsICJBZWdsYUZlIiwgIkFlZ2xhRm8iKSklPiUKICBkcm9wX25hKGMoIk4iKSklPiUKICBtdXRhdGUoYm94X2dyb3VwID0gIkNyYWJzIiwKICAgICAgICAgcm93X29yZGVyID0gMTpucm93KC4pKQphZWdsYQpgYGAKI0V4cGxvcmUgdGhlIGRhdGEKYGBge3J9CnBfd2lkdGggPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9V2lkdGgpKQpwX2RlcHRoIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PURlcHRoKSkKcF9mbG93IDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUZsb3cpKQpwX3BoIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PXBIKSkKcF90ZHMgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9VERTKSkKcF9jb25kPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9Q29uZCkpCnBfbiA8LSBhZWdsYSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1OKSkKcF9uaSA8LSBhZWdsYSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1OaSkpCnBfbnQgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9TnQpKQpwX3Bob3MgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9UGhvcykpCnBfbWcgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9TWcpKQpwX2NhIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUNhKSkKcF9jcmFiIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUNyYWIpKQpwX3dpZHRoICsgcF9kZXB0aCArIHBfZmxvdyAKCmBgYAoKYGBge3J9CnBfcGggKyBwX3RkcyArIHBfY29uZCAgCmBgYApgYGB7cn0KcF9uICsgcF9uaSArIHBfbnQgCmBgYAoKYGBge3J9CnBfcGhvcyArIHBfbWcgKyBwX2NhICsgcF9jcmFiCmBgYApgYGB7cn0KZ2dwbG90KGFlZ2xhLCBhZXMoeD1yb3dfb3JkZXIsIHk9UGhvcykpKwogIGdlb21fYm94cGxvdCgpKwogIGdlb21fcG9pbnQoKQpgYGAKI1RoZSBvdXRsaWVycyBJIGZvdW5kIGFyZSBzYW1wbGUgMSwgd2hlcmUgdGhlIFBob3NwaGF0ZSBsZXZlbHMgYXJlIGFsbW9zdCA0IHRpbWVzIGhpZ2hlciB0aGFuIHRoZSBuZXh0IGhpZ2hlc3QgdmFsdWUsIHNhbXBsZSAxNCBoYXMgbG93IHBIIGF0IDYuMjUsIHdpdGggdGhlIG5leHQgbG93ZXN0IG1lYXN1cmVtZW50IGJlaW5nIDYuNzUgYW5kIDAgd2F0ZXJmbG93LCBhbmQgc2FtcGxlIDIyIHdhcyB0YWtlbiBhdCBhIHdpZHRoIG9mIDEyLjUgKG1ldGVycz8pIGFuZCBhIGRlcHRoIG9mIDUgbWV0ZXJzLiAgVGhlIHdpZHRoIG1lYXN1cmVtZW50IGlzIG5vdCBtdWNoIG9mIGFuIG91dGxpZXIsIGJ1dCB0aGUgZGVwdGggbWVhc3VyZW1lbnQgaXMgdHdpY2UgYXMgZGVlcCBhcyB0aGUgbmV4dCBoaWdoZXN0IHZhbHVlLiAgSSB3b3VsZCBjb250ZW5kIHRoYXQgdGhlIHJlYWwgb3V0bGllciBpcyB0aGUgcGhvc3BoYXRlIGxldmVsIGluIHNhbXBsZSAxLiAgCgojUGxvdCBmb3VyIHZhcmlhYmxlcyB3aXRoIGEgQ2xldmVsYW5kIHBsb3QuIEl0IGp1c3Qgc28gaGFwcGVuZWQgdGhhdCBJIG1hZGUgcGxvdHMgZm9yIGFsbCBvZiB0aGUgdmFyaWFibGVzLi4uIApgYGB7cn0KcF93aWR0aCArIHBfZGVwdGggKyBwX2NvbmQgKyBwX2NyYWIgKyBwbG90X2xheW91dChucm93ID0gMiwgbmNvbCA9IDIpCmBgYAojTWFrZSB0aHJlZSBoaXN0b2dyYW1zCmBgYHtyfQpoYTEgPC0gZ2dwbG90KGRhdGEgPSBhZWdsYSkrCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBOKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IC4wMDI1LAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBjbG9zZWQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikKaGExCgoKCmBgYApgYGB7cn0KaGEyIDwtIGdncGxvdChkYXRhID0gYWVnbGEpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4PVBob3MpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gLjAwNSwKICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IDAsCiAgICAgICAgICAgICAgICAgY2xvc2VkID0gInJpZ2h0IiwKICAgICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIikKaGEyCmBgYApgYGB7cn0KaGEzIDwtICBnZ3Bsb3QoYWVnbGEpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4PXBIKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IC4wMDUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGNsb3NlZCA9ICJyaWdodCIsCiAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIikKaGEzCmBgYAojQ3JlYXRlIGRlbnNpdHkgcGxvdHMKYGBge3J9CmhkcDEgPC0gZ2dwbG90KGFlZ2xhKSsKICBnZW9tX2RlbnNpdHkoYWVzKHg9TikpCmhkcDEKCmBgYApgYGB7cn0KaGRwMiA8LSBnZ3Bsb3QoYWVnbGEpKwogIGdlb21fZGVuc2l0eShhZXMoeD1QaG9zKSkKaGRwMgpgYGAKYGBge3J9CmhkcDMgPC0gZ2dwbG90KGFlZ2xhKSsKICBnZW9tX2RlbnNpdHkoYWVzKHg9cEgpKQpoZHAzCmBgYAojVXNlIHBhdGNod29yayB0byBwcm9kdWNlIDIgY29sIG1hdHJpeApgYGB7cn0KaGExICsgaGRwMSArIGhhMiArIGhkcDIgKyBoYTMgKyBoZHAzICsgcGxvdF9sYXlvdXQobmNvbD0yLCBucm93ID0gMykKYGBgCgoK